/*******************************************************************************
 * Copyright 2010 Ray Ling
 * 
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 * 
 *   http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 ******************************************************************************/
package org.ring.rinject;

import org.ring.rinject.annotation.RinjectBase;
import org.ring.rinject.collection.Mapper;
import org.ring.rinject.exception.AlreadyMappedException;

public class RinjectEnvironment extends Mapper<String, Object> {

	public RinjectEnvironment set(String base, Object concrete)
			throws AlreadyMappedException {
		return set(base, concrete);
	}

	public RinjectEnvironment set(String base, Object concrete, boolean overwrite)
			throws AlreadyMappedException {
		if (overwrite || (!mapper.containsKey(base))) {
			RinjectWrapper wrapper = new RinjectWrapper(concrete);
			mapper.put(base, wrapper);
		} else {
			throw new AlreadyMappedException("Base[" + base
					+ "] is already mapped!", concrete, mapper.get(base));
		}

		return this;
	}
	
	public RinjectWrapper concrete(Object base){
		String b = null;
		if(base instanceof Class<?>){
			RinjectBase rbase = ((Class<?>)base).getAnnotation(RinjectBase.class);
			if (null != rbase) {
				b = rbase.value();
			}
		}else if(base instanceof String){
			b = (String)base;
		}
		return (RinjectWrapper) mapper.get(b);
	}
	
	public RinjectWrapper concrete(String base){
		return (RinjectWrapper) mapper.get(base);
	}
}
